package com.blrs.service.questionnaire.impl;

import java.util.*;

import com.blrs.common.constant.RouteIndex;
import com.blrs.common.core.domain.AjaxResult;
import com.blrs.common.core.domain.entity.SysDept;
import com.blrs.common.utils.ReflectionUtils;
import com.blrs.common.utils.SecurityUtils;
import com.blrs.common.utils.StringUtils;
import com.blrs.domain.*;
import com.blrs.mapper.*;
import com.blrs.service.indexInfo.IInfoIndexService;
import com.blrs.service.questionnaire.IQuestionnaireInvestigationService;
import com.blrs.system.mapper.SysDeptMapper;
import com.blrs.system.service.ISysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 问卷调查Service业务层处理
 * 
 * @author yang
 * @date 2023-11-27
 */
@Service
public class QuestionnaireInvestigationServiceImpl implements IQuestionnaireInvestigationService
{
    @Autowired
    private QuestionnaireInvestigationMapper questionnaireInvestigationMapper;
    @Autowired
    private SysDeptMapper sysDeptMapper;
    @Autowired
    private EnterpriseInfoMapper enterpriseInfoMapper;
    @Autowired
    private QuestionnaireReceptionMapper questionnaireReceptionMapper;
    @Autowired
    private QuestionnaireEnrollMapper questionnaireEnrollMapper;
    @Autowired
    private QuestionnaireTitleMapper questionnaireTitleMapper;
    @Autowired
    private QuestionnaireAnswersMapper questionnaireAnswerMapper;
    @Autowired
    private ISysDeptService sysDeptService;
    @Autowired
    private IInfoIndexService infoIndexService;


    /**
     * 查询问卷调查
     * 
     * @param questionnaireId 问卷调查主键
     * @return 问卷调查
     */
    @Override
    public QuestionnaireInvestigation selectQuestionnaireInvestigationByQuestionnaireId(String questionnaireId)
    {
        QuestionnaireInvestigation questionnaireInvestigation = questionnaireInvestigationMapper.selectQuestionnaireInvestigationByQuestionnaireId(questionnaireId);
        return questionnaireInvestigation;
    }

    /**
     * 查询问卷调查列表
     * 
     * @param questionnaireInvestigation 问卷调查
     * @return 问卷调查
     */
    @Override
    public List<QuestionnaireInvestigation> selectQuestionnaireInvestigationList(QuestionnaireInvestigation questionnaireInvestigation)
    {
        questionnaireInvestigation.setBelongTo(SecurityUtils.getOrgId());
        List<QuestionnaireInvestigation> questionnaireInvestigations = questionnaireInvestigationMapper.selectQuestionnaireInvestigationList(questionnaireInvestigation);
        //遍历查询每条问卷对应的接收企业数量
        questionnaireInvestigations.forEach(questionnaireInvestigation1 -> {
            questionnaireInvestigation1.setSendNum(questionnaireReceptionMapper.selectByQuestionnaireIdNum(questionnaireInvestigation1.getQuestionnaireId(),null));
            questionnaireInvestigation1.setReturnNum(questionnaireReceptionMapper.selectByQuestionnaireIdNum(questionnaireInvestigation1.getQuestionnaireId(),1));
        });
        //查询回传问卷的数量
       return questionnaireInvestigations;
    }

    @Override
    public List<QuestionnaireInvestigation> selectQuestionnaireInvestigationByEnterpriseIdList(QuestionnaireInvestigation questionnaireInvestigation)
    {

        //接收方，需要通过接收id来查询当前用户能访问的数据列表
        List<QuestionnaireInvestigation> questionnaireInvestigations = questionnaireInvestigationMapper.selectByReception(questionnaireInvestigation);
        //查询作答人
        for (QuestionnaireInvestigation investigation : questionnaireInvestigations) {
            if (investigation.getIsAnswer()>0){
                //查询作答表
                QuestionnaireEnroll questionnaireEnroll =questionnaireEnrollMapper.selectEnrollByQuestionnaireId(investigation.getQuestionnaireId(),SecurityUtils.getOrgId());
                investigation.setAnswerUser(questionnaireEnroll.getPersonnelName());
            }
        }
        //查询回传问卷的数量
        return questionnaireInvestigations;
    }

    @Override
    public List<QuestionnaireInvestigation> selectQuestionnaireInvestigationListByOrgId(QuestionnaireInvestigation questionnaireInvestigation) {
        if (Objects.isNull(questionnaireInvestigation.getReceiverId())){
            return Collections.emptyList();
        }
        questionnaireInvestigation.setBelongTo(SecurityUtils.getOrgId());
        return questionnaireInvestigationMapper.selectQuestionnaireInvestigationListByOrgId(questionnaireInvestigation);
    }

    /**
     * 新增问卷调查
     * 
     * @param questionnaireInvestigation 问卷调查
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String insertQuestionnaireInvestigation(QuestionnaireInvestigation questionnaireInvestigation) throws NoSuchFieldException, IllegalAccessException {
        questionnaireInvestigation.setQuestionnaireId(UUID.randomUUID().toString().replaceAll("-",""));
        if(questionnaireInvestigation.getQuestionnaireType().equals("第三方")){
            if (questionnaireInvestigation.getSendType().equals("groupSend")){
                for (String s : questionnaireInvestigation.getEnterpriseId()) {
                    if (StringUtils.isNotEmpty(s)){
                        //先查询对应组织机构id
                        QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                        //根据企业id查询企业名称
                        String enterpriseName = enterpriseInfoMapper.selectEnterpriseInfoByEnterpriseId(s).getEnterpriseName();
                        //根据企业名称查询组织机构id
                        questionnaireReception.setReceiverId(sysDeptMapper.selectByDeptName(enterpriseName).getDeptId());
                        questionnaireReception.setEnterpriseId(s);
                        questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                        questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                        questionnaireReception.setEnterpriseName(enterpriseName);
                        questionnaireReceptionMapper.insertQuestionnaireReception(questionnaireReception);
                    }
                }
            }else if(questionnaireInvestigation.getSendType().equals("oneClick")) {
                //说明是一键发送
                //获取所有的入驻企业id
                List<SysDept> deptList = sysDeptMapper.selectOrgList(null);
                List<QuestionnaireReception> receptionList = new ArrayList<>();
                for (SysDept sysDept : deptList) {
                    QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                    questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                    questionnaireReception.setReceiverId(sysDept.getDeptId());
                    questionnaireReception.setEnterpriseName(sysDept.getDeptName());
                    questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                    receptionList.add(questionnaireReception);
                }
                if (!receptionList.isEmpty()) {
                    questionnaireReceptionMapper.batchInsertQuestionnaireReception(receptionList);
                }
            }
            ReflectionUtils.setCommonPrivateProperty(questionnaireInvestigation);
            questionnaireInvestigation.setBelongTo(SecurityUtils.getOrgId());
            questionnaireInvestigation.setOrganizationName(SecurityUtils.getOrgName());
            //状态
            questionnaireInvestigation.setStatus("审核");
            questionnaireInvestigation.setReceiverId(String.join(",",questionnaireInvestigation.getEnterpriseId()));
            questionnaireInvestigationMapper.insertQuestionnaireInvestigation(questionnaireInvestigation);
        }else {
            //判断是分类还是一键
            if (questionnaireInvestigation.getSendType().equals("groupSend")){
                for (String s : questionnaireInvestigation.getEnterpriseId()) {
                    if (StringUtils.isNotEmpty(s)){
                        //先查询对应组织机构id
                        QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                        //根据企业id查询企业名称
                        String enterpriseName = enterpriseInfoMapper.selectEnterpriseInfoByEnterpriseId(s).getEnterpriseName();
                        //根据企业名称查询组织机构id
                        questionnaireReception.setReceiverId(sysDeptMapper.selectByDeptName(enterpriseName).getDeptId());
                        questionnaireReception.setEnterpriseId(s);
                        questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                        questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                        questionnaireReception.setEnterpriseName(enterpriseName);
                        questionnaireReceptionMapper.insertQuestionnaireReception(questionnaireReception);
                    }
                }
            }else if (questionnaireInvestigation.getSendType().equals("oneClick")){
                //获取所有的入驻企业id
                List<SysDept> deptList = sysDeptMapper.selectOrgList(null);
                List<QuestionnaireReception> receptionList = new ArrayList<>();
                for (SysDept sysDept : deptList) {
                    QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                    questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                    questionnaireReception.setReceiverId(sysDept.getDeptId());
                    questionnaireReception.setEnterpriseName(sysDept.getDeptName());
                    questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                    receptionList.add(questionnaireReception);
                }
                // 批量插入
                if (!receptionList.isEmpty()) {
                    questionnaireReceptionMapper.batchInsertQuestionnaireReception(receptionList);
                }
            }
            ReflectionUtils.setCommonPrivateProperty(questionnaireInvestigation);
            questionnaireInvestigation.setBelongTo(SecurityUtils.getOrgId());
            questionnaireInvestigation.setOrganizationName(SecurityUtils.getOrgName());
            //状态
            questionnaireInvestigation.setStatus("草稿");
            questionnaireInvestigation.setReceiverId(String.join(",",questionnaireInvestigation.getEnterpriseId()));
            questionnaireInvestigationMapper.insertQuestionnaireInvestigation(questionnaireInvestigation);
        }
     return questionnaireInvestigation.getQuestionnaireId();
    }

    /**
     * 修改问卷调查
     * 
     * @param questionnaireInvestigation 问卷调查
     * @return 结果
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int updateQuestionnaireInvestigation(QuestionnaireInvestigation questionnaireInvestigation)
    {
        if (questionnaireInvestigation.getQuestionnaireType().equals("第三方")){
            //判断传入的是一键发送还是分类群发
            if (questionnaireInvestigation.getSendType().equals("groupSend")){
                //说明是分类群发,删除旧的接收表数据，添加新的
                questionnaireReceptionMapper.deleteQuestionnaireReceptionByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                for (String s : questionnaireInvestigation.getEnterpriseId()) {
                    if (StringUtils.isNotEmpty(s)){
                        //先查询对应组织机构id
                        QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                        //根据企业id查询企业名称
                        String enterpriseName = enterpriseInfoMapper.selectEnterpriseInfoByEnterpriseId(s).getEnterpriseName();
                        //根据企业名称查询组织机构id
                        questionnaireReception.setReceiverId(sysDeptMapper.selectByDeptName(enterpriseName).getDeptId());
                        questionnaireReception.setEnterpriseId(s);
                        questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                        questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                        questionnaireReception.setEnterpriseName(enterpriseName);
                        questionnaireReceptionMapper.insertQuestionnaireReception(questionnaireReception);
                    }
                }
            }else if (questionnaireInvestigation.getSendType().equals("oneClick")){
                //说明是一键发送
                if (questionnaireInvestigationMapper.selectIsSend(questionnaireInvestigation.getQuestionnaireId()).equals("groupSend")){
                    //说明修改之前为分类群发
                    questionnaireReceptionMapper.deleteQuestionnaireReceptionByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                    //获取所有的入驻企业id
                    List<SysDept> deptList = sysDeptMapper.selectOrgList(null);
                    List<QuestionnaireReception> receptionList = new ArrayList<>();
                    for (SysDept sysDept : deptList) {
                        QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                        questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                        questionnaireReception.setReceiverId(sysDept.getDeptId());
                        questionnaireReception.setEnterpriseName(sysDept.getDeptName());
                        questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                        receptionList.add(questionnaireReception);
                    }
                    // 批量插入
                    if (!receptionList.isEmpty()) {
                        questionnaireReceptionMapper.batchInsertQuestionnaireReception(receptionList);
                    }
                }
            }else {
                //说明修改成了不发送，这里需要删除所有的接收信息
                questionnaireReceptionMapper.deleteQuestionnaireReceptionByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
            }
            //删除原有的题目以及答案
          //先获取该问卷所有的题目id
            List<QuestionnaireTitle> questionnaireTitles = questionnaireTitleMapper.selectQuestionnaireTitleListByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
            for (QuestionnaireTitle questionnaireTitle : questionnaireTitles) {
                //删除答案
                questionnaireAnswerMapper.deleteQuestionnaireAnswersByTopicId(questionnaireTitle.getTopicId());
                //删除题目
                questionnaireTitleMapper.deleteQuestionnaireTitleByTopicId(questionnaireTitle.getTopicId());
            }
        }else {
            Integer integer = questionnaireTitleMapper.selectNumTitleByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
              if (integer>0){
//                  questionnaireInvestigation.setStatus("审核");
                  //说明这个问卷是存在题目的
                  if (questionnaireInvestigation.getSendType().equals("groupSend")){
                      //说明是分类群发,删除旧的接收表数据，添加新的
                      questionnaireReceptionMapper.deleteQuestionnaireReceptionByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                      for (String s : questionnaireInvestigation.getEnterpriseId()) {
                          if (StringUtils.isNotEmpty(s)){
                              //先查询对应组织机构id
                              QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                              //根据企业id查询企业名称
                              String enterpriseName = enterpriseInfoMapper.selectEnterpriseInfoByEnterpriseId(s).getEnterpriseName();
                              //根据企业名称查询组织机构id
                              questionnaireReception.setReceiverId(sysDeptMapper.selectByDeptName(enterpriseName).getDeptId());
                              questionnaireReception.setEnterpriseId(s);
                              questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                              questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                              questionnaireReception.setEnterpriseName(enterpriseName);
                              questionnaireReceptionMapper.insertQuestionnaireReception(questionnaireReception);
                          }
                      }
                  }else if (questionnaireInvestigation.getSendType().equals("oneClick")){
                      questionnaireReceptionMapper.deleteQuestionnaireReceptionByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                      //获取所有的入驻企业id
                      List<SysDept> deptList = sysDeptMapper.selectOrgList(null);
                      List<QuestionnaireReception> receptionList = new ArrayList<>();
                      for (SysDept sysDept : deptList) {
                          QuestionnaireReception questionnaireReception = new QuestionnaireReception();
                          questionnaireReception.setQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                          questionnaireReception.setReceiverId(sysDept.getDeptId());
                          questionnaireReception.setEnterpriseName(sysDept.getDeptName());
                          questionnaireReception.setQuestionnaireName(questionnaireInvestigation.getQuestionnaireName());
                          receptionList.add(questionnaireReception);
                      }
                      // 批量插入
                      if (!receptionList.isEmpty()) {
                          questionnaireReceptionMapper.batchInsertQuestionnaireReception(receptionList);
                      }
                  }else {
                      //说明修改成了不发送，这里需要删除所有的接收信息
                      questionnaireReceptionMapper.deleteQuestionnaireReceptionByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
                  }
              }
        }

        return questionnaireInvestigationMapper.updateQuestionnaireInvestigation(questionnaireInvestigation);
    }

    /**
     * 批量删除问卷调查
     * 
     * @param questionnaireIds 需要删除的问卷调查主键
     * @return 结果
     */
    @Override
    public int deleteQuestionnaireInvestigationByQuestionnaireIds(String[] questionnaireIds)
    {
        return questionnaireInvestigationMapper.deleteQuestionnaireInvestigationByQuestionnaireIds(questionnaireIds);
    }

    /**
     * 删除问卷调查信息
     * 
     * @param questionnaireId 问卷调查主键
     * @return 结果
     */
    @Override
    public int deleteQuestionnaireInvestigationByQuestionnaireId(String questionnaireId)
    {
        return questionnaireInvestigationMapper.deleteQuestionnaireInvestigationByQuestionnaireId(questionnaireId);
    }

    @Override
    public List<QuestionnaireInvestigation> selectQuestionnaireInvestigationListHis(QuestionnaireInvestigation questionnaireInvestigation) {
        questionnaireInvestigation.setBelongTo(SecurityUtils.getOrgId());
        return questionnaireInvestigationMapper.selectQuestionnaireInvestigationListHis(questionnaireInvestigation);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult examineById(QuestionnaireInvestigation questionnaireInvestigation) {
        if (Objects.nonNull(questionnaireInvestigation.getExamineStatus()) && questionnaireInvestigation.getExamineStatus().equals("termination")){
            //说明审核不通过
            questionnaireInvestigationMapper.updateExamine(questionnaireInvestigation);
            //并且删除所有的发送单位数据
            questionnaireReceptionMapper.deleteQuestionnaireReceptionByQuestionnaireId(questionnaireInvestigation.getQuestionnaireId());
            return AjaxResult.success();
        }
        infoIndexService.createAndInsertInfoIndex(
                questionnaireInvestigation.getQuestionnaireId(),
                questionnaireInvestigation.getQuestionnaireName(),
                questionnaireInvestigation.getOrganizationName(),
                questionnaireInvestigation.getBelongTo(),
                "问卷调查",
                RouteIndex.QUESTIONNAIRE_ROUTE,
                2088L,
                questionnaireInvestigation.getSendType()
        );
        return AjaxResult.success( questionnaireInvestigationMapper.updateQuestionnaireInvestigationByStatus(questionnaireInvestigation));
    }

    @Override
    public List<QuestionnaireInvestigation> selectQuestionnaireInvestigationListReception(QuestionnaireInvestigation questionnaireInvestigation) {
        //查询当前用户接收的问卷列表
        //接收方，需要通过接收id来查询当前用户能访问的数据列表

        List<QuestionnaireInvestigation> questionnaireInvestigations = questionnaireInvestigationMapper.selectByReception(questionnaireInvestigation);
        //查询作答人
        for (QuestionnaireInvestigation investigation : questionnaireInvestigations) {
               if (investigation.getIsAnswer()>0){
                 //查询作答表
                   QuestionnaireEnroll questionnaireEnroll =questionnaireEnrollMapper.selectEnrollByQuestionnaireId(investigation.getQuestionnaireId(),Long.valueOf(questionnaireInvestigation.getReceiverId()));
                   investigation.setAnswerUser(questionnaireEnroll.getPersonnelName());
               }
        }
        return questionnaireInvestigations;
    }

    @Override
    public List<QuestionnaireInvestigation> selectQuestionnaireInvestigationListByExamine(QuestionnaireInvestigation questionnaireInvestigation) {
        List<QuestionnaireInvestigation> questionnaireInvestigations = questionnaireInvestigationMapper.selectQuestionnaireInvestigationListByExamine(questionnaireInvestigation);
        //遍历查询每条问卷对应的接收企业数量
        questionnaireInvestigations.forEach(questionnaireInvestigation1 -> {
            questionnaireInvestigation1.setSendNum(questionnaireReceptionMapper.selectByQuestionnaireIdNum(questionnaireInvestigation1.getQuestionnaireId(),null));
            questionnaireInvestigation1.setReturnNum(questionnaireReceptionMapper.selectByQuestionnaireIdNum(questionnaireInvestigation1.getQuestionnaireId(),1));
        });
        //查询回传问卷的数量
        return questionnaireInvestigations;
    }

    @Override
    public AjaxResult selectQuestionnaireInvestigationExamineById(String id) {
        //查询该问卷是否添加过题目
        if (questionnaireTitleMapper.selectNumTitleByQuestionnaireId(id)==0){
            return AjaxResult.error("提交失败,请给自定义问卷添加题目");
        }
       questionnaireInvestigationMapper.updateQuestionnaireInvestigationByStatusId(id);
        return AjaxResult.success();
    }
}